import axios from 'axios'
import type { AxiosInstance, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例
const service: AxiosInstance = axios.create({
  baseURL: '/api',
  timeout: 10000,
})

// 请求拦截器
service.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 直接从 localStorage 获取 token，确保获取到最新的
    const token = localStorage.getItem('token')

    if (token && config.headers) {
      config.headers.set('Authorization', `Bearer ${token}`)
    } else {
      console.log('请求拦截器 - 未设置 Authorization header，token:', token)
    }
    return config
  },
  (error) => {
    console.error('请求拦截器错误:', error)
    return Promise.reject(error)
  },
)

// 响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 检查响应数据是否是我们的统一格式
    const data = response.data
    if (data && typeof data === 'object' && 'code' in data && 'message' in data) {
      // 这是我们的统一响应格式
      if (data.code === 200) {
        return data.data // 直接返回 data 字段
      } else {
        ElMessage.error(data.message || '请求失败')
        return Promise.reject(new Error(data.message || '请求失败'))
      }
    } else {
      // 不是统一格式，直接返回原始数据
      return data
    }
  },
  (error) => {
    console.error('响应拦截器错误:', error)

    let message = '请求失败'

    if (error.response) {
      // 服务器返回了错误状态码
      const data = error.response.data
      if (data && typeof data === 'object' && data.message) {
        message = data.message
      } else {
        message = `请求失败: ${error.response.status}`
      }
    } else if (error.request) {
      // 请求发送了但没有收到响应
      message = '网络错误，请检查网络连接'
    } else {
      // 其他错误
      message = error.message || '请求失败'
    }

    ElMessage.error(message)

    if (error.response?.status === 401) {
      // token过期，跳转到登录页
      localStorage.removeItem('token')
      localStorage.removeItem('user')
      window.location.href = '/login'
    }

    return Promise.reject(error)
  },
)

export default service
